package com.osfw.activiti.service.resource;


import com.baomidou.mybatisplus.extension.service.IService;
import com.osfw.activiti.domain.ProcessNodeInfo;
import com.osfw.activiti.entity.resource.ActReProcdef;
import com.osfw.activiti.enums.resource.ProcdefNodeObj;
import com.osfw.framework.exception.ServiceException;
import com.osfw.system.entity.manage.SysUser;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 流程定义表 服务层
 */
public interface IActReProcdefService extends IService<ActReProcdef> {

    List<ActReProcdef> selectProcdefList(ActReProcdef procdef, SysUser sysUser);

    /**
     * @param procdef
     * @param sysUser
     * @return
     */
    boolean saveProcdef(ActReProcdef procdef, SysUser sysUser);

    /**
     * 通过流程key查询所有版本的流程配置信息
     *
     * @return
     */
    List<ActReProcdef> selectProcdefByProcKey(String prockey);

    /**
     * 通过流程key查询所有版本的流程配置信息
     *
     * @return
     */
    ActReProcdef getLatestVersionProcdefByProcKey(String prockey);

    /**
     * 获取所有最新版本的流程配置数据
     *
     * @param sysUser 当前用户
     * @return
     */
    List<ActReProcdef> selectLatestVersionProcdef(SysUser sysUser);

    /**
     * 获取Start节点信息
     *
     * @param procDefId 流程定义ID
     * @return 开始节点信息
     */
    ProcessNodeInfo getStartNodeInfo(Long procDefId);

    /**
     * 获取Start节点信息
     *
     * @param procdef 流程定义信息
     * @return 开始节点信息
     */
    ProcessNodeInfo getStartNodeInfo(ActReProcdef procdef);

    /**
     * 获取下个节点信息
     *
     * @param procDefId 流程定义ID
     * @param actKey    当前节点KEY
     * @return 下个节点信息
     */
    ProcessNodeInfo getNextNodeInfo(Long procDefId, String actKey);

    /**
     * 获取下个节点信息
     *
     * @param procdef 流程定义信息
     * @param actKey  当前节点KEY
     * @return 下个节点信息
     */
    ProcessNodeInfo getNextNodeInfo(ActReProcdef procdef, String actKey);

    /**
     * 获取下一节点签收人
     *
     * @param procNextNode 下一节点信息
     */
    List<SysUser> getNextNodeAssignees(ProcessNodeInfo procNextNode);

    /**
     * 获取End节点信息
     *
     * @param procDefId 流程定义ID
     * @return 结束节点信息
     */
    ProcessNodeInfo getEndNodeInfo(Long procDefId);

    /**
     * 是否流程End节点
     *
     * @param procDefId 流程定义ID
     * @param actKey    流程节点KEY
     */
    boolean isEndNode(Long procDefId, String actKey);

}
